package configstc

import (
	"flag"
	"fmt"
	"gitee.com/captials-team/ubdframe/src/common/utils"
	"io"
	"os"
)

const _configPath = "./data/config.yaml"

var DefiConfigPath = ParseConfigPath

// ParseConfigPath 	默认的config path获取
func ParseConfigPath(s ...string) string {
	var filepath = ""

	if len(s) == 0 {
		s = append(s, _configPath)
	}
	if s[0] == "" {
		s[0] = _configPath
	}

	set := flag.NewFlagSet("", flag.ContinueOnError)
	set.StringVar(&filepath, "c", s[0], "use config path")
	set.SetOutput(io.Discard)
	set.Parse(os.Args[1:])

	return filepath
}

func LoadConfig[T interface{}](c *T, s ...string) *T {
	err := utils.ReadYamlFile(c, ParseConfigPath(s...))
	if err != nil {
		panic(fmt.Sprintf("read config yaml: %s", err))
	}

	return c
}

// ServerConfig 服务配置
type ServerConfig struct {
	Enable         bool   `json:"Enable" yaml:"Enable"`                 //是否启用
	ServerBindAddr string `json:"ServerBindAddr" yaml:"ServerBindAddr"` //ListenAndServe to bind to, such as 0.0.0.0
	Port           int    `json:"Port" yaml:"Port"`                     //端口
	Host           string `json:"Host" yaml:"Host"`                     // Host is the hostname or IP address of the service.
	Timeout        int    `json:"Timeout" yaml:"Timeout"`               //Timeout specifies a timeout (in milliseconds)

	EndpointAddr string `json:"EndpointAddr" yaml:"EndpointAddr"` //对外访问地址
	EndpointPort int    `json:"EndpointPort" yaml:"EndpointPort"` //对外访问端口

	AllowOrigins []string `json:"AllowOrigins"` //指定跨域允许访问源，空则为不限制访问
}

// ListenAddr 服务监听地址
func (c ServerConfig) ListenAddr() string {
	return fmt.Sprintf("%s:%d", c.ServerBindAddr, c.Port)
}

// Endpoint 服务对外访问地址
func (c ServerConfig) Endpoint() string {
	return fmt.Sprintf("%s:%d", c.EndpointAddr, c.EndpointPort)
}

// HostAddr 域名访问地址
func (c ServerConfig) HostAddr() string {
	if c.Host == "" {
		return fmt.Sprintf("127.0.0.1:%d", c.Port)
	}
	return fmt.Sprintf("%s:%d", c.Host, c.Port)
}

// AuthConfig 授权配置
type AuthConfig struct {
	Enable      bool   `json:"Enable" yaml:"Enable"`           //是否启用
	SecretKey   string `json:"SecretKey" yaml:"SecretKey"`     //加密秘钥，如JWT
	AuthExpired int64  `json:"AuthExpired" yaml:"AuthExpired"` //授权失效时间，单位：秒
}

// DBConfig 数据库配置
type DBConfig struct {
	DbDsn string `json:"DbDsn" yaml:"DbDsn"` //数据库dsn

	DbConn     string `json:"DbConn" yaml:"DbConn"`         //数据库类型,如mysql
	DbHost     string `json:"DbHost" yaml:"DbHost"`         //数据库地址
	DbPort     string `json:"DbPort" yaml:"DbPort"`         //端口
	DbUser     string `json:"DbUser" yaml:"DbUser"`         //用户名
	DbPassword string `json:"DbPassword" yaml:"DbPassword"` //密码
	DbName     string `json:"DbName" yaml:"DbName"`         //数据库

	MaxIdleConn  int    `default:"0" json:"MaxIdleConn" yaml:"MaxIdleConn"`         //预留并发链接数
	MaxOpenConn  int    `default:"0" json:"MaxOpenConn" yaml:"MaxOpenConn"`         //最大支持链接
	MaxLifeTime  int    `default:"0" json:"ConnMaxLifeTime" yaml:"ConnMaxLifeTime"` //每个链接最大生存时间
	MaxIdleTime  int    `default:"0" json:"ConnMaxIdleTime" yaml:"ConnMaxIdleTime"` //每个链接最大空闲时间
	MaxConcatLen string `default:"" json:"MaxConcatLen" yaml:"MaxConcatLen"`

	TablePrefix string `json:"TablePrefix" yaml:"TablePrefix"` //表前缀
	TimeZone    string `json:"TimeZone" yaml:"TimeZone"`       //时区设置
}

// EmailConfig 邮箱配置
type EmailConfig struct {
	Enable       bool   `json:"Enable" yaml:"Enable"`
	SmtpName     string `json:"SmtpName" yaml:"SmtpName"`         //smtp 发送名称
	SmtpHost     string `json:"SmtpHost" yaml:"SmtpHost"`         //smtp服务host
	SmtpPort     int    `json:"SmtpPort" yaml:"SmtpPort"`         //smtp服务端口
	SmtpUserName string `json:"SmtpUserName" yaml:"SmtpUserName"` //smtp用户名
	SmtpPassword string `json:"SmtpPassword" yaml:"SmtpPassword"` //smtp密码
}

// LimitingConfig 限流配置
type LimitingConfig struct {
	PerRate int `json:"PerRate" yaml:"PerRate"` //每次（秒）速率
	MaxRate int `json:"MaxRate" yaml:"MaxRate"` //允许的最大速率
}

// MonitorReportConfig 监控（上报）配置
type MonitorReportConfig struct {
	Platform  string `json:"Platform" yaml:"Platform"`   //上报平台，prometheus/prometheus_push/aws/aliyun
	Host      string `json:"Host" yaml:"Host"`           //上报地址，使用prometheus时为本地启动http地址如: :9090
	Name      string `json:"Name" yaml:"Name"`           //名称,推送的指标名称
	Namespace string `json:"Namespace" yaml:"Namespace"` //推送指标的命名空间
}

// WebHookConfig webhook配置
type WebHookConfig struct {
	Url         string `json:"Url" yaml:"Url"`
	AccessToken string `json:"AccessToken" yaml:"AccessToken"` //部分应用需要放header中
}

// PProfConfig webhook配置
type PProfConfig struct {
	Enable bool  `json:"Enable" yaml:"Enable"`
	Port   int64 `json:"Port" yaml:"Port"` //用于pprof的端口号，如： 8808
}

// ThirdConfig 第三方配置
type ThirdConfig struct {
	Enable    bool   `json:"Enable" yaml:"Enable"`       //是否启用第三方
	AppKey    string `json:"AppKey" yaml:"AppKey"`       // app id/key
	AppSecret string `json:"AppSecret" yaml:"AppSecret"` //appSecret

	//扩展参数，微信： EncodingAESKey
	ExtendParams CommonExtendParams `json:"ExtendParams" yaml:"ExtendParams"` //扩展其他参数
}

// AccessKeyConfig 常用的accessKey配置
type AccessKeyConfig struct {
	AccessKey    string `json:"AccessKey" yaml:"AccessKey"`       // appKey
	AccessSecret string `json:"AccessSecret" yaml:"AccessSecret"` //appSecret
}
